package 其他;

import javafx.css.CssMetaData;
import sun.util.resources.cldr.sn.CurrencyNames_sn;

import java.util.*;

/*数列的定义如下： 数列的第一项为n，以后各项为前一项的平方根，求数列的前m项的和。
输入描述
        输入数据有多组，每组占一行，由两个整数n（n<10000）和m(m<1000)组成，n和m的含义如前所述。

        输出描述
        对于每组输入数据，输出该数列的和，每个测试实例占一行，要求精度保留2位小数。
        样例输入
        81 4
        2 2

        样例输出
        94.73
        3.41
 */
/*public class Main {
    public static void main(String[] args) {
        Scanner sc =  new Scanner(System.in);
        while (sc.hasNext()){
            double sum = 0, n;
            n = sc.nextFloat();
            int m = sc.nextInt();
            for (int i = 0; i < m; i++) {
                sum += n;
                n = Math.sqrt(n);

            }
            System.out.printf("%.2f" , sum);
        }

    }
}
 */

/*
题目描述：
春天是鲜花的季节，水仙花就是其中最迷人的代表，数学上有个水仙花数，他是这样定义的：
“水仙花数”是指一个三位数，它的各位数字的立方和等于其本身，比如：153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。

输入描述
输入数据有多组，每组占一行，包括两个整数m和n（100<=m<=n<=999）。

输出描述
对于每个测试实例，要求输出所有在给定范围内的水仙花数，就是说，输出的水仙花数必须大于等于m,并且小于等于n，
如果有多个，则要求从小到大排列在一行内输出，之间用一个空格隔开; 如果给定的范围内不存在水仙花数，则输出no;
每个测试实例的输出占一行。


样例输入
100 120
300 380

样例输出
no
370 371
 */
/*
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            int m = sc.nextInt();
            int n = sc.nextInt();
            int a, b, c;
            boolean flag = false;
            for (int i = m; i <= n; i++) {
                a = i % 10;
                b = i % 100 / 10;
                c = i / 100;
                if(i == a*a*a + b*b*b + c*c*c) {
                    System.out.print(i + " ");
                    flag = true;
                }
            }
            if(flag == false)
                System.out.print("no");
        }
    }
}
 */
/*
输入描述:
输入第一行仅包含三个正整数n,x,y，分别表示参赛的人数和晋级淘汰人数区间。(1<=n<=50000,1<=x,y<=n)

输入第二行包含n个整数，中间用空格隔开，表示从1号选手到n号选手的成绩。(1<=|a_i|<=1000)


输出描述:
输出仅包含一个整数，如果不存在这样的m，则输出-1，否则输出符合条件的最小的值。


输入例子1:
6 2 3
1 2 3 4 5 6

输出例子1:
3
 */
/*
public class Main {
    public static void main(String[] args) {
        Scanner sc  = new Scanner(System.in);
        int min;
        boolean flag = false;
        int n = sc.nextInt();
        int x = sc.nextInt();
        int y = sc.nextInt();
        int[] score = new int[n];
        for (int i = 0; i < n; i++) {
            score[i] = sc.nextInt();
        }


        Arrays.sort(score);
        for (int i = y; i >= x; i--) {
            if(n - i >=x && n - i <= y) {
                min = score[n - i - 1];
                flag = true;
                System.out.println(min);
                break;
            }
        }
        if (!flag)
            System.out.println(-1);
    }
}

 */
/*
输入描述:
输入第一行仅包含一个正整数n，表示任意序列的长度。(1<=n<=20000)
输入第二行包含n个整数，表示给出的序列，每个数的绝对值都小于10000。

输出描述:
输出仅包含一个整数，表示最少的操作数量。

输入例子1:
5
-1 2 3 10 100

输出例子1:
103



先对输入的序列进行升序排列。我们需要明白，无论是什么排列的正则序列，
改动最少的方案一定是对输入序列和正则序列中相同排名的元素进行修改，
即输入序列中排名第 i 的元素应该修改为正则序列中的 i。除此之外，
其他的任何方案都至少存在一个数，使得它并不是修改为离它最近的正则序列中的数，
这样就会使得修改次数增多。
 */
public class Main02 {
    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }

        Arrays.sort(arr);
        int count = 0;
        for (int i = 1; i <= n; i++) {
            count += Math.abs(arr[i - 1] - i);
        }
        System.out.println(count);
    }
}